﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using QuanCafe.QuanCafe_BUS_WebService;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace QuanCafe
{
    public partial class frmTrangChu : Form
    {

        #region Khai báo các biến ban đầu

        // khai báo socket
        private const int BUFFER_SIZE = 1024;
        private const int PORT_NUMBER = 9999;

        static ASCIIEncoding encoding = new ASCIIEncoding();

        // tạo biến nhận chuỗi thông báo
        string _nhanthongbao;

        // tạo socket;
        Thread thread;

        bool _ngatsocket = false;

        private string _manhanvien;

        // tạo 1 biến kiểu nhanvien
        private NhanVienDTO _nhanVienTruc = new NhanVienDTO();

        // tạo biến kiểm tra đã đăng nhập hay chưa
        private bool _daDangNhap = false;


        // tạo formThucUong để gọi
        frmThucUong _frmThucUong = new frmThucUong();

        // tạo formNhomThucUong để gọi
        frmNhomThucUong _frmNhomThucUong = new frmNhomThucUong();

        // tạo formPhieuDat để gọi
        frmPhieuDat _frmPhieuDat = new frmPhieuDat();

        // tạo formHoaDon để gọi
        frmHoaDonThanhToan _frmHoaDon = new frmHoaDonThanhToan();

        // tạo form BanUong để gọi
        frmBanUong _frmBanUong = new frmBanUong();


        // tạo 1 biến service
        private QuanCafe_BUS_WebServiceSoapClient ws = new QuanCafe_BUS_WebServiceSoapClient();

        #endregion


        #region quản lý các delegate

        // viết hàm nhận thông tin từ FrmDangNhap
        public void NhanThongTinFromFrmDangNhap(string manhanvien, string matkhau)
        {
            // gọi service để lấy về thông tin nhân viên
            _manhanvien = manhanvien;
            _nhanVienTruc = ws.NV_XemThongTinNhanVien(manhanvien);
            // sau đó, để lên uscNhanVienTruc
            uscNhanVienTruc.Hoten = _nhanVienTruc.Tennhanvien;
            uscNhanVienTruc.Catruc = _nhanVienTruc.Calamviec;
            uscNhanVienTruc.Anhdaidien = _nhanVienTruc.Anhdaidien;
            _daDangNhap = true;
        }

        // viết hàm nhận thông tin từ frmCapNhatAnh
        public void NhanThongTinFormFrmNV_CapNhatAnh(bool kqua)
        {
            if (kqua == true)
            {
                _nhanVienTruc = ws.NV_XemThongTinNhanVien(_manhanvien);
                // load anhdaidien len
                uscNhanVienTruc.Anhdaidien =_nhanVienTruc.Anhdaidien; 
            }
        }

        #endregion


        #region Khởi tạo ban đầu

        // khởi tạo mặc định
        public frmTrangChu()
        {
            InitializeComponent();
            // khởi tạo các sự kiện
            uscNhanVienTruc.nhanVienTruc_clickAnh += new ucNhanVienTruc.NhanVienTruc_ClickAnhHandle(NhanVienTruc_LoadAnhDaiDien);
            uscNhanVienTruc.nhanVienTruc_dangXuat += new ucNhanVienTruc.NhanVienTruc_DangXuatHandle(NhanVienTruc_DangXuat);
            uscNhanVienTruc.nhanVienTruc_doiMatKhau += new ucNhanVienTruc.NhanVienTruc_DoiMatKhauHandle(NhanVienTruc_DoiMatKhau);
        }

        private void frmTrangChu_Load(object sender, EventArgs e)
        {
            // gọi form dang nhap len
            GoiFormDangNhap();
            // gọi socket
            thread = new Thread(Goi_SocKet);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }

        // xử lý làm vẽ của tooltip
        private void ttpInfo_Draw(object sender, DrawToolTipEventArgs e)
        {
            e.DrawBackground();
            e.DrawText();
        }

        #endregion


        # region Xử lý các chức năng chính

        // viết hàm xử lý sự kiện load ảnh cho nhân viên
        public void NhanVienTruc_LoadAnhDaiDien()
        {
            ShowFormNV_CapNhatAnh();
        }

        // viết hàm đăng xuất
        public void NhanVienTruc_DangXuat()
        {
            uscNhanVienTruc.Hoten = "";
            uscNhanVienTruc.Catruc = "";
            uscNhanVienTruc.Anhdaidien = "http://quangcaokhacviet.somee.com/Image/NhanVien/";
            _daDangNhap = false;
            pnlLoadForm.Visible = false;
            // gọi lại hàm đăng nhập
            GoiFormDangNhap();

        }

        

        // viết hàm đổi mật khẩu cho nhân viên
        public void NhanVienTruc_DoiMatKhau()
        {
            if (_daDangNhap == true)
            {
                // gọi form doimatkhau
                Thread threadDoiMatKhau = new Thread(ShowFormDoiMatKhau);
                threadDoiMatKhau.SetApartmentState(ApartmentState.STA);
                threadDoiMatKhau.Start();
            }
            else
            {
                // xuất ra thông báo
                MessageBox.Show("bạn chưa đăng nhập!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                GoiFormDangNhap();
            }
        }

        // gọi form ThucUong
        private void btnQLThucUong_Click(object sender, EventArgs e)
        {
            if (_daDangNhap == true)
            {
                // ẩn mấy cái form khác
                _frmNhomThucUong.Hide();
                _frmPhieuDat.Hide();
                _frmHoaDon.Hide();
                _frmBanUong.Hide();


                // add vào
                _frmThucUong.TopLevel = false;
                _frmThucUong.Dock = DockStyle.Fill;
                _frmThucUong.FormBorderStyle = FormBorderStyle.None;
                _frmThucUong.Visible = true;
                pnlLoadForm.Controls.Add(_frmThucUong);
                _frmThucUong.Show();
                pnlLoadForm.Visible = true;
            }
            else
            {
                // xuất ra thông báo
                MessageBox.Show("bạn chưa đăng nhập!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                GoiFormDangNhap();
            }
            
        }


        // gọi form NhomThucUong
        private void btnQLNhomThucUong_Click(object sender, EventArgs e)
        {
            

            if (_daDangNhap == true)
            {
                // ẩn mấy cái form #
                _frmThucUong.Hide();
                _frmPhieuDat.Hide();
                _frmHoaDon.Hide();
                _frmBanUong.Hide();

                // add vào 
                _frmNhomThucUong.TopLevel = false;
                _frmNhomThucUong.Dock = DockStyle.Fill;
                _frmNhomThucUong.FormBorderStyle = FormBorderStyle.None;
                _frmNhomThucUong.Visible = true;
                pnlLoadForm.Controls.Add(_frmNhomThucUong);
                _frmNhomThucUong.Show();
                pnlLoadForm.Visible = true;
            }
            else
            {
                // xuất ra thông báo
                MessageBox.Show("bạn chưa đăng nhập!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                GoiFormDangNhap();
            }
        }

        // gọi form QuanLyPhieuDat
        private void btnQLPhieuDat_Click(object sender, EventArgs e)
        {
            if (_daDangNhap == true)
            {
                // ẩn mấy cái form #
                _frmThucUong.Hide();
                _frmNhomThucUong.Hide();
                _frmHoaDon.Hide();
                _frmBanUong.Hide();

                // add vào 
                _frmPhieuDat.TopLevel = false;
                _frmPhieuDat.Dock = DockStyle.Fill;
                _frmPhieuDat.FormBorderStyle = FormBorderStyle.None;
                _frmPhieuDat.Visible = true;
                pnlLoadForm.Controls.Add(_frmPhieuDat);
                _frmPhieuDat.Show();
                pnlLoadForm.Visible = true;
            }
            else
            {
                // xuất ra thông báo
                MessageBox.Show("bạn chưa đăng nhập!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                GoiFormDangNhap();
            }
        }


        // gọi form QuanLyHoaDon
        private void btnQLHoaDon_Click(object sender, EventArgs e)
        {
            if (_daDangNhap == true)
            {
                // ẩn mấy cái form #
                _frmThucUong.Hide();
                _frmNhomThucUong.Hide();
                _frmPhieuDat.Hide();
                _frmBanUong.Hide();

                // add vào 
                _frmHoaDon.TopLevel = false;
                _frmHoaDon.Dock = DockStyle.Fill;
                _frmHoaDon.FormBorderStyle = FormBorderStyle.None;
                _frmHoaDon.Visible = true;
                pnlLoadForm.Controls.Add(_frmHoaDon);
                _frmHoaDon.Show();
                pnlLoadForm.Visible = true;
            }
            else
            {
                // xuất ra thông báo
                MessageBox.Show("bạn chưa đăng nhập!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                GoiFormDangNhap();
            }
        }

        private void btnQLBanUong_Click(object sender, EventArgs e)
        {
            if (_daDangNhap == true)
            {
                // ẩn mấy cái form khác
                _frmNhomThucUong.Hide();
                _frmPhieuDat.Hide();
                _frmHoaDon.Hide();
                _frmThucUong.Hide();

                // add vào
                _frmBanUong.TopLevel = false;
                _frmBanUong.Dock = DockStyle.Fill;
                _frmBanUong.FormBorderStyle = FormBorderStyle.None;
                _frmBanUong.Visible = true;
                pnlLoadForm.Controls.Add(_frmBanUong);
                _frmBanUong.Show();
                pnlLoadForm.Visible = true;
            }
            else
            {
                // xuất ra thông báo
                MessageBox.Show("bạn chưa đăng nhập!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                GoiFormDangNhap();
            }
        }

        #endregion


        #region Các xử lý đến thread

        // gọi formDangNhap
        public void GoiFormDangNhap()
        {
            frmDangNhap _frmDangNhap = new frmDangNhap();
            _frmDangNhap.Send2TrangChu = new frmDangNhap.SendInfo2FrmTrangChu(NhanThongTinFromFrmDangNhap);
            // show form lên
            _frmDangNhap.ShowDialog();
        }

        // gọi FormDoiMatKhau
        public void ShowFormDoiMatKhau()
        {

            // tạo form doimatkhau
            frmDoiMatKhau _frmDoiMatKhau = new frmDoiMatKhau(_nhanVienTruc.Manhanvien);
            Application.Run(_frmDoiMatKhau);

        }

        // gọi FormCapNhatAnh
        public void ShowFormNV_CapNhatAnh()
        {
            frmNV_CapNhatAnh _frmCapNhatAnh = new frmNV_CapNhatAnh(_nhanVienTruc.Manhanvien, _nhanVienTruc.Matkhau, _nhanVienTruc.Anhdaidien);
            _frmCapNhatAnh.Send2TrangChu = new frmNV_CapNhatAnh.SendLink2FrmTrangChu(NhanThongTinFormFrmNV_CapNhatAnh);
            //show len
            _frmCapNhatAnh.ShowDialog();
        }

        // gọi socket
        public void Goi_SocKet()
        {
            conect();
        }

        // đóng thread lại 
        private void frmTrangChu_FormClosing(object sender, FormClosingEventArgs e)
        {
            _ngatsocket = true;
        }

        private void frmTrangChu_FormClosed(object sender, FormClosedEventArgs e)
        {
            thread.Abort();
        }

        #endregion


        #region Xử lý socket

        // viết hàm connect
        public void conect()
        {
            try
            {
                int portNumber = 9999;// Convert.ToInt32(ConfigurationManager.AppSettings["PortNumber"].ToString());
                //int maxPendingConnection = 20;// Convert.ToInt32(ConfigurationManager.AppSettings["MaxPendingConnection"].ToString());

                TcpListener listener = new TcpListener(IPAddress.Any, portNumber);

                // 1. listen
                listener.Start();

                //Console.WriteLine("Server started on "+listener.LocalEndpoint);
                //Console.WriteLine("Waiting for a connection...");
                
                // đợi chờ lắng nghe

                // tạo biến socket
                Socket socket = listener.AcceptSocket();

                //Console.WriteLine("Connection received from " + socket.RemoteEndPoint);

                var stream = new NetworkStream(socket);
                var reader = new StreamReader(stream);
                var writer = new StreamWriter(stream);
                writer.AutoFlush = true;

                while (true) // khi có tín hiệu
                {
                    // 2. receive
                    string str = reader.ReadLine();
                    _nhanthongbao = str;
                    // đổi màu nút nhận thông báo
                    btnNhanThongBao.BackColor = Color.Blue;
                    writer.WriteLine("bye");
                    break;
                }
                // 4. close
                stream.Close();
                socket.Close();
                listener.Stop();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex);
            }
            Console.Read();
        }

        // hiện tin thông báo lên
        private void btnNhanThongBao_Click(object sender, EventArgs e)
        {
            // hiện thông báo lên
            MessageBox.Show("Có khách hàng tại bàn số " + _nhanthongbao + " đang đặt thức uống!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
            // đổi màu lại
            btnNhanThongBao.BackColor = Color.Green;
        }

        #endregion

        private void quảnLýHóaĐơnToolStripMenuItem_Click(object sender, EventArgs e)
        {
            btnQLHoaDon_Click(sender, e);
        }

        private void toolStripTextBox1_Click(object sender, EventArgs e)
        {
            btnQLThucUong_Click(sender, e);
        }

        private void quảnLýNhómToolStripMenuItem_Click(object sender, EventArgs e)
        {
            btnQLNhomThucUong_Click(sender, e);
        }

        private void quảnLýBànUốngToolStripMenuItem_Click(object sender, EventArgs e)
        {
            btnQLBanUong_Click(sender, e);
        }

        private void quảnLýPhiếuĐặtToolStripMenuItem_Click(object sender, EventArgs e)
        {
            btnQLPhieuDat_Click(sender, e);
        }

        private void thoátToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }


      


        


        






















    }
}
